<?php
require_once "interface/Gi_Request_Interface.php";
abstract class Gi_Request_Abstract implements Gi_Request_Interface{
    /**
  * @desc estas variables son ports a los arrays de php
  */
  public $post;
  public $get;
  public $request;
  public $server;
  public $files;
  public $env;
  public $cookie;
  public $headers;//disponible en apache solamente
  
  /**
  * @desc variables del objeto
  */
  private $_uri; //uri de la peticion ejemplo http://dominio.com/controller/action/p1/v1 etc
  private $_base_url; //url base ejemplo http://dominio.com/ seria la url base del ejemplo anterior
  private $_url; //seria la otra parte controller/action/p1/v1
  
  private $_controller = false; //el controller de la peticion
  private $_action = false; //el action de la peticion
  private $_params = array(); //parametros
  
  private $_dispatched = false; //flag para saber si el request fue o no despachado
  private $_module = false;
  
  public function __construct() {
    $this->post = $_POST;
    $this->get = $_GET;
    $this->request = $_REQUEST;
    $this->server = $_SERVER;
    $this->files = $_FILES;
    $this->env = $_ENV;
    $this->cookie = $_COOKIE;
    
    if (function_exists("getallheaders")){
      $this->headers = getallheaders();
    }
    
    $this->_set_url();
  }
  
  private function _set_url () {
    $uri = $_SERVER[REQUEST_URI];
    $script = $_SERVER[SCRIPT_NAME];
    
    $arr_uri = explode("/",$uri);
    $arr_script = explode("/",$script);
    
    $i = 0;
    while ($arr_script[$i] == $arr_uri[$i]) {
      unset ($arr_uri[$i]);
      $arr_default_url[]= $arr_script[$i];
      $i++;
    }
    $this->_url = implode("/",$arr_uri); //la url que contiene la peticion
    $this->_url = ereg_replace("\?.*","",$this->_url); //le sacamos el query string a la peticion
    $this->_base_url = implode("/",$arr_default_url); //la url desde donde corre el index.php
    $this->_uri = "http://" . $_SERVER[HTTP_HOST] . $uri; //la uri completa
    
    return $this;
  }
  
  /**
  * @desc devuelve la url
  */
  public function get_url () {
    return $this->_url;
  }
  /**
  * @desc devuelve la url base
  */
  public function get_base_url () {
    return "http://" . $_SERVER[HTTP_HOST] . $this->_base_url. "/";
  }
  
  /**
  * @desc devuelve la uri
  */
  public function get_uri () {
  return $this->_uri;
  }
  
  /**
  * @desc setea el modulo
  */
  public function set_module ($module) {
    $this->_module = $module;
  }
  
  /**
  * @desc obtiene el modulo
  */
  public function get_module () {
    return $this->_module; 
  } 
  
  /**
  * @desc setea el controller
  */
  public function set_controller ($controller) {
    $this->_controller = $controller;
  }
  
  /**
  * @desc obtiene el controller
  */
  public function get_controller () {
    return $this->_controller; 
  }
  
  /**
  * @desc setea el action
  */
  public function set_action ($action) {
    $this->_action = $action;          
  }
  
  /**
  * @desc obtiene el action
  */
  public function get_action() {
    return $this->_action;
  }
  
  /**
  * @desc setea los parametros
  */
  public function set_params (array $params) {
    $this->_params = array();
    $this->_params = $params;
  }
  
  /**
  * @desc obtiene los parametros
  */
  public function get_params () {
     return $this->_params;
  }
  
  /**
  * @desc indica si fue o no despachado el request
  */
  public function is_dispatched () {
    return $this->_dispatched;
  }
  
  /**
  * @desc cambia el estado del flag que indica si fue o no despachado el request
  */
  public function set_despatched ($flag = true) {
    if ($flag === false)
      $this->_dispatched = $flag;
    else if ($flag === true) 
      $this->_dispatched = $flag;
    
    return true;
  }
}